/*!
 * \file sap_core.h
 *
 * \brief SAP数据包解析
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 *
 * \version 2.0
 * \author wuwk
 * \date 2016/08/24
 *
 */
#ifndef _SAP_CORE_H_
#define _SAP_CORE_H_

#include "frmem.h"
#include "frct_comm.h"
#include "frdb_cursor.h"
#include "frreport_comm.h"
#include "frbyte_buffer.h"


#define SAP_HEAD_LEN                20

#define SAP_REQUEST                 0
#define SAP_RESPONSE                1

/* 分片包数据 */
typedef struct __st_L7_fragment_sap {
    uint64_t u64_total_len;                 /* 实际数据总长度 */
    uint64_t u64_left_len;                  /* 还需要接收的数据长度 */
    Frbyte_Packet *p_st_data;               /* packet数据 */
} L7_fragment_sap;

/* 头部 */
typedef struct __st_L7_head_sap {
    int i_iscompressed;
    int i_isreq;
    int i_errno;
    unsigned long ul_packet_len;
    unsigned long ul_uncompress_len;
    int i_magic;
} L7_head_sap;

/**/
typedef struct __st_L7_session_sap {
    char *p_title;
} L7Session_sap;

/*
 *  sap私有数据
*/
typedef struct __st_L7session_sap_private {
    unsigned long ul_seq;                   /* 序列号，1次req和response时，使用同一个序列号 */
    L7_fragment_sap *p_st_fragment;         /* 分片包数据 */
    Frbyte_Packet *p_st_uncompress_data;
    L7_head_sap *p_st_head;                 /* 头部 */
    Frtrans_info st_trans_info;             /* 传输信息 */
    Frreport_body_data *p_st_data_req;      /* 请求上报数据 */
    Frreport_body_data *p_st_data_resp;     /* 响应上报数据 */
    Frlist_header *p_lst_req;               /* 请求信息 */
    L7Session_sap *p_st_l7_session;         /* session信息 */
} L7session_sap_private;


int sap_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);
int sap_analysis(Conntrack *p_st_conn
                  , Apm_packet *p_st_packet
                  , Frhash_header *p_st_hash_report);
int sap_session_destroy(void *p_private_session);
void sap_frlist_data_free(Frdata_field *p_st_node_data);

#endif
